/*
 * Copyright (c) 2014 Johannes Mittendorfer (http://johannes-mittendorfer.com)
 * Licensed under the MIT License (LICENSE.txt).
 *
 * Version 2.1.1
 * Build 2014-10-07
 */

var EAN13, pluginName;

pluginName = null;

"use strict";

EAN13 = (function() {
    EAN13.prototype.settings = {};

    EAN13.prototype.init = function() {
        var checkDigit, code;
        if (this.number.length === 12) {
            checkDigit = this.generateCheckDigit(this.number);
            this.number += checkDigit;
        }
        if (this.number.length === 13) {
            if (this.validate()) {
                this.settings.onValid.call();
            } else {
                this.settings.onInvalid.call();
            }
            code = this.getCode();
            return this.draw(code);
        } else {
            return this.settings.onError.call();
        }
    };

    EAN13.prototype.getCode = function() {
        var c_encoding, code, countries, i, parts, raw_number, x, y, z;
        x = ["0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011"];
        y = ["0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001", "0001001", "0010111"];
        z = ["1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100"];
        countries = ["xxxxxx", "xxyxyy", "xxyyxy", "xxyyyx", "xyxxyy", "xyyxxy", "xyyyxx", "xyxyxy", "xyxyyx", "xyyxyx"];
        code = "";
        c_encoding = countries[parseInt(this.number.substr(0, 1), 10)].split("");
        raw_number = this.number.substr(1);
        parts = raw_number.split("");
        i = 0;
        while (i < 6) {
            if (c_encoding[i] === "x") {
                code += x[parts[i]];
            } else {
                code += y[parts[i]];
            }
            i++;
        }
        i = 6;
        while (i < 12) {
            code += z[parts[i]];
            i++;
        }
        return code;
    };

    EAN13.prototype.clear = function(context) {
        return context.clearRect(0, 0, this.settings.width, this.settings.height);
    };

    EAN13.prototype.draw = function(code) {
        var border_height, chars, context, height, i, item_width, layout, left, lines, offset, prefix, width, x, _i, _ref;
        layout = {
            prefix_offset: 0.06,
            font_stretch: 0.073,
            border_line_height_number: 0.9,
            border_line_height: 1,
            line_height: 0.9,
            font_size: 0.15,
            font_y: 1.03,
            text_offset: 4.5
        };
        width = (this.settings.prefix ? this.settings.width - (this.settings.width * layout.prefix_offset) : this.settings.width);
        if (this.settings.number) {
            border_height = layout.border_line_height_number * this.settings.height;
            height = layout.line_height * border_height;
        } else {
            border_height = layout.border_line_height * this.settings.height;
            height = border_height;
        }
        item_width = width / 95;
        if (this.id) {
            context = wx.createCanvasContext(this.id, this.ctx);
            this.clear(context);
            context.setFillStyle(this.settings.color);
            left = this.settings.number && this.settings.prefix ? this.settings.width * layout.prefix_offset : 0;
            lines = code.split("");
            context.fillRect(left, 0, item_width, border_height);
            left = left + item_width * 2;
            context.fillRect(left, 0, item_width, border_height);
            left = left + item_width;
            i = 0;
            while (i < 42) {
                if (lines[i] === "1") {
                    context.fillRect(left, 0, Math.floor(item_width) + 1, height);
                }
                left = left + item_width;
                i++;
            }
            left = left + item_width;
            context.fillRect(left, 0, item_width, border_height);
            left = left + item_width * 2;
            context.fillRect(left, 0, item_width, border_height);
            left = left + item_width * 2;
            i = 42;
            while (i < 84) {
                if (lines[i] === "1") {
                    context.fillRect(left, 0, Math.floor(item_width) + 1, height);
                }
                left = left + item_width;
                i++;
            }
            context.fillRect(left, 0, item_width, border_height);
            left = left + item_width * 2;
            context.fillRect(left, 0, item_width, border_height);
            if (this.settings.number) {
                context.setFontSize(layout.font_size * height + "px monospace");
                prefix = this.number.substr(0, 1);
                if (this.settings.prefix) {
                    context.fillText(prefix, 0, border_height * layout.font_y);
                }
                offset = item_width * layout.text_offset + (this.settings.prefix ? layout.prefix_offset * this.settings.width : 0);
                chars = this.number.substr(1, 6).split("");
                chars.forEach(function(value, key) {
                    context.fillText(value, offset, border_height * layout.font_y);
                    return offset += layout.font_stretch * width;
                });
                offset = 49 * item_width + (this.settings.prefix ? layout.prefix_offset * this.settings.width : 0) + layout.text_offset;
                chars = this.number.substr(7).split("")
                chars.forEach(function(value, key) {
                    context.fillText(value, offset, border_height * layout.font_y);
                    return offset += layout.font_stretch * width;
                });
            }
            if (this.settings.debug) {
                for (x = _i = 0, _ref = item_width * 2; _ref > 0 ? _i <= width : _i >= width; x = _i += _ref) {
                    context.beginPath();
                    context.rect(x, height * 0.4, item_width, height * 0.1);
                    context.setFillStyle('red');
                    context.fill();
                }
            }
            context.draw()
            return this.settings.onSuccess.call();
        } else {
            return this.settings.onError.call();
        }
    };

    EAN13.prototype.generateCheckDigit = function(number) {
        var chars, counter;
        counter = 0;
        chars = number.split("");
        chars.forEach(function(value, key) {
            if (key % 2 === 0) {
                return counter += parseInt(value, 10);
            } else {
                return counter += 3 * parseInt(value, 10);
            }
        });
        return 10 - (counter % 10) % 10;
    };

    EAN13.prototype.validate = function() {
        return parseInt(this.number.slice(-1), 10) === this.generateCheckDigit(this.number.slice(0, -1));
    };

    function EAN13(id, number, options, ctx) {
        var option;
        this.id = id;
        this.number = number;
        this.ctx = ctx
        this.settings = {
            width: 200,
            height: 100,
            number: true,
            prefix: true,
            color: "black",
            debug: false,
            onValid: function() {},
            onInvalid: function() {},
            onSuccess: function() {},
            onError: function() {}
        };
        if (options) {
            for (option in options) {
                this.settings[option] = options[option];
            }
        }
        this._name = pluginName;
        this.init();
    }

    return EAN13;

})();

if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
    module.exports = EAN13;
}